<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
       /* 
      call/apply的作用
        1. 调用函数
        2. 改变函数的this指向为自己的第一个参数
        3. 返回函数的返回值
      bind的作用
        1. 修改并固定了f的this指向为自己的第一个参数
        2. 返回一个和原函数内容一致的新函数(只不过this被固定了)
    
    */
       
       function Person(name,age){
            this.name=name;
            this.age=age;

            return 1
        }
        person.prototype.do=function(){
            console.log("你好啊老铁");
        }

        // 手写new的函数  ...arg这个是扩展运算符的方法
        function myNew(constr,...arg){
        //1.创建一个对象
        const obj ={};
        //2.调用构造函数把构造函数的this指向我们创建的对象
        const re =constr.apply(obj,arg ) 
        // 3把obj的隐式原型指向构造函数的原型对象 
        obj.__proto__=constr.prototype;
        // 4. 返回值（判断构造函数的返回值是基本类型还是引用类型）
            if(typeof re ==="object"&&re!==null||typeof re ==="function"){
                return re;
            }else{
                return obj
            }
    }
        const p1=myNew(Person,"xiaoming",18)
        console.log(p1,"p1");
    </script>
</body>
</html>